// global_logger.h
#pragma once

// 确保在包含spdlog头文件之前定义SPDLOG_ACTIVE_LEVEL
#ifndef SPDLOG_ACTIVE_LEVEL
#define SPDLOG_ACTIVE_LEVEL SPDLOG_LEVEL_TRACE
#endif

#include "log_manager.h"
#include <memory>

class GlobalLogger {
public:
    static GlobalLogger& getInstance() {
        static GlobalLogger instance;
        return instance;
    }

    void initialize(const std::string& log_dir = "logs",
                   const std::string& file_prefix = "project",
                   int retention_days = 5) {
        if (!logger_manager_) {
            logger_manager_ = std::make_unique<LoggerManager>(log_dir, file_prefix, retention_days);
            logger_ = logger_manager_->getLogger();
            // 显式设置日志级别为trace，确保debug日志也会输出
            if (logger_) {
                logger_->set_level(spdlog::level::trace);
                logger_->flush_on(spdlog::level::trace); // 设置立即刷新
            }
        }
    }

    std::shared_ptr<spdlog::logger> getLogger() {
        return logger_;
    }

    // 添加设置日志级别的方法
    void setLogLevel(spdlog::level::level_enum level) {
        if (logger_) {
            logger_->set_level(level);
        }
    }

private:
    GlobalLogger() = default;
    std::unique_ptr<LoggerManager> logger_manager_;
    std::shared_ptr<spdlog::logger> logger_;
};

// 使用宏简化调用
#define GLOBAL_LOGGER GlobalLogger::getInstance().getLogger()

// 定义日志宏，确保包含源文件名、行号、函数名信息
#define LOG_TRACE(...) SPDLOG_LOGGER_TRACE(GLOBAL_LOGGER, __VA_ARGS__)
#define LOG_DEBUG(...) SPDLOG_LOGGER_DEBUG(GLOBAL_LOGGER, __VA_ARGS__)
#define LOG_INFO(...) SPDLOG_LOGGER_INFO(GLOBAL_LOGGER, __VA_ARGS__)
#define LOG_WARN(...) SPDLOG_LOGGER_WARN(GLOBAL_LOGGER, __VA_ARGS__)
#define LOG_ERROR(...) SPDLOG_LOGGER_ERROR(GLOBAL_LOGGER, __VA_ARGS__)
#define LOG_CRITICAL(...) SPDLOG_LOGGER_CRITICAL(GLOBAL_LOGGER, __VA_ARGS__)